//
//  main.m
//  NSString基本概念
//
//  Created by wenjim on 17/10/21.
//  Copyright © 2017年 WenJim. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
    // 如何创建字符串对象
    /*
     通过不同的方式创建字符串，字符串对象存储的位置也不一样
        >如果是通过字符串常量创建，那么字符串对象存储在常量区中
        >如果是通过alloc initWithFormat ／ stringWithFormat 创建，那么字符串对象存储在堆区中
     
     而且需要注意：
     不同的平台存储的方式也不一样    如果是Mac平台系统会自动对字符串对象进行优化，但是如果是iOS平台就是两个对象
     不同的编译器存储的方式也不一样  如果是Xcode6以下并且是在iOS平台，那么每次alloc 都会创建一个新的对象，如果是在Xcode6以上，那么alloc多次指向同一块存储空间
     
     */
    //
    // 1.通过字符串常量创建
    // 注意：如果是通过字符串常量创建字符串对象，并且字符串常量的内容一致，那么如果创建多个字符串对象，多个对象指向同一块存储空间
    NSString * str = @"cwj";
    NSString * str1 = @"cwj";
    NSLog(@"str = %p, str1 = %p",str,str1);
    
    // 2.通过alloc init创建
    // 只要调用alloc 就会在堆内存中开辟一块存储空间
    NSString * str2 = [[NSString alloc] initWithFormat:@"cwj"];
    NSString * str22 = [[NSString alloc] initWithFormat:@"cwj"];
    NSLog(@"str2 = %p, str22 = %p",str2,str22);
    
    // 3.通过类工厂方法创建／ stringWithFormart
    // 内部其实就是封装了 alloc init
    NSString * str3 = [NSString stringWithFormat:@"zbc"];
    NSString * str33 = [NSString stringWithFormat:@"zbc"];
    NSLog(@"str3 = %p, str33 = %p",str3,str33);
    
    
    
    /*
     注意：一般情况下，只要是通过alloc或者通过类工厂方法创建的对象，每次都会在堆内存中开辟一块新的存储空间
     
     但是如果是通过alloc 的initWithString 方法除外，因为这个方法是通过copy返回一个字符串对象给我们
     而copy又分为深拷贝和浅拷贝，如果是深拷贝会创建一个新的对象，如果是浅拷贝不会创建一个新的对象，而是直接返回被拷贝的对象的地址给我们
     而 initWithString 正好是浅拷贝，所以无论是在什么平台，什么编译器都是指向同一块存储空间
     */
    NSString * str4 = [[NSString alloc] initWithString:@"zbc"];
    NSString * str45 = [[NSString alloc] initWithString:@"zbc"];
    NSLog(@"str4 = %p, str45 = %p",str4,str45);
    
    return 0;
}
